package com.zust.zst.controller.studentstatus;

import com.zust.zst.aop.HttpAuthChecker;
import com.zust.zst.aop.HttpRoleChecker;
import com.zust.zst.common.dto.studentstatus.*;
import com.zust.zst.common.vo.ResultVO;
import com.zust.zst.common.vo.studentstatus.ClazzVO;
import com.zust.zst.common.vo.studentstatus.MajorVO;
import com.zust.zst.common.vo.studentstatus.StudentInfoVO;
import com.zust.zst.common.vo.studentstatus.StudentUpdateVO;
import com.zust.zst.controller.studentstatus.util.NowAdminInfo;
import com.zust.zst.studentstatus.service.StudentInfoManagementService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

import static com.zust.zst.common.enums.OperationStatus.INSERT_FAILED;
import static com.zust.zst.common.enums.OperationStatus.UPDATE_FAILED;

/**
 * 学籍管理：学生信息管理接口
 *
 * @author ldnb
 * @date 2022/11/24 16:10
 */

@RestController
@Api(tags = "学籍管理：学生信息管理接口")
@Slf4j
@RequestMapping("/studentstatus/studentInfoManagement")
public class StudentInfoManagementController {

    /**
     * 没有参数, "0"
     */
    private static final String NO_PARAM = "0";

    @Resource(name = "studentInfoManagementServiceImpl")
    private StudentInfoManagementService studentInfoManagementService;

    /**
     * 获取当前教务所属学院的全部专业
     *
     * @return 获取到的当前教务所属学院的专业
     */
    @ApiOperation(value = "获取当前教务所属学院的全部专业")
    @GetMapping("/getAllMajors")
    @HttpAuthChecker
    public ResultVO<MajorVO> getAllMajors() {

        int uid = NowAdminInfo.getUserUid2();//获取当前登录教务的工号

        MajorVO majorVO = new MajorVO();
        List<String> majors = studentInfoManagementService.getAllMajors(uid);
        if (majors != null) {
            majorVO.setMajors(majors);
            log.info("获取了当前教务所属学院的全部专业{}", majorVO);
            return ResultVO.success("当前教务所属学院的全部专业", majorVO);
        }
        log.warn("获取当前教务所属学院的全部专业失败");
        return ResultVO.error("获取当前教务所属学院的全部专业信息失败");
    }

    /**
     * 获取当前所选专业的全部班级
     *
     * @return 获取到的当前所选专业的全部班级
     */
    @ApiOperation(value = "获取当前所选专业的全部班级")
    @PostMapping("/getAllMajorClazzs")
    @HttpAuthChecker
    public ResultVO<ClazzVO> getAllMajorClazzs(@RequestBody MajorToSelectClazzDTO majorDTO) {

        ClazzVO clazzVO = new ClazzVO();
        List<String> clazzs = studentInfoManagementService.getAllMajorClazzs(majorDTO);
        if (clazzs != null) {
            clazzVO.setClazzs(clazzs);
            log.info("获取了当前所选专业的全部班级{}", clazzVO);
            return ResultVO.success("当前所选专业的全部班级", clazzVO);
        }
        log.warn("获取当前所选专业的全部班级失败");
        return ResultVO.error("获取当前所选专业的全部班级信息失败");
    }

    /**
     * 插入学生学籍信息
     */
    @ApiOperation(value = "插入学生学籍信息")
    @PostMapping("/addStudent")
    @HttpAuthChecker
    @HttpRoleChecker({"admin"})
    public ResultVO<String> addStudent(@RequestBody AddStudentDTO addStudentDTO) {

        int uid = NowAdminInfo.getUserUid2();//获取当前登录教务的工号

        if (studentInfoManagementService.addStudent(uid, addStudentDTO) == INSERT_FAILED.getCode()) {
            log.warn("插入失败：{}", addStudentDTO);
            return ResultVO.error(INSERT_FAILED.getDescription());
        }
        log.info("插入成功：{}", addStudentDTO);
        return ResultVO.success("插入成功", null);
    }

    /**
     * 1.获取当前教务/管理员所属学院的全部学生
     *
     * @return 获取到的当前教务/管理员所属学院的全部学生
     */
    @ApiOperation(value = "获取当前教务/管理员所属学院的全部学生")
    @PostMapping("/getCollegeStudent")
    @HttpAuthChecker
    public ResultVO<List<StudentInfoVO>> getCollageStudent(@RequestBody SearchCollegeStudentDTO dto) {

        int uid = NowAdminInfo.getUserUid2();//获取当前登录教务的工号

        List<StudentInfoVO> studentInfoVO = studentInfoManagementService.getCollegeStudent(uid, dto);
        if (studentInfoVO != null) {
            log.info("所属学院的学生信息：{}", studentInfoVO);
            return ResultVO.success("所属学院的学生信息", studentInfoVO);
        }
        log.warn("所属学院暂无相应学生信息！");
        return ResultVO.error("所属学院暂无相应学生信息!");
    }

    /**
     * 2.获取当前教务/管理员所属学院的全部学生信息条数
     *
     * @return 获取到的当前教务/管理员所属学院的学生信息条数
     */
    @ApiOperation(value = "获取当前教务/管理员所属学院的全部学生信息条数")
    @GetMapping("/getTotalLineCollegeStudent")
    @HttpAuthChecker
    public ResultVO<Integer> getTotalLineCollegeStudent() {

        int uid = NowAdminInfo.getUserUid2();//获取当前登录教务的工号

        int count = studentInfoManagementService.getTotalLineCollegeStudent(uid);
        log.info("所属学院的全部学生信息条数：{}", count);
        return ResultVO.success("所属学院的全部学生信息条数", count);
    }

    /**
     * 3.通过学号和姓名获取当前教务/管理员所属学院的全部学生
     *
     * @return 获取到的对应学号和姓名的当前教务/管理员所属学院的全部学生
     */
    @ApiOperation(value = "通过学号和姓名获取当前教务/管理员所属学院的全部学生")
    @PostMapping("/getCollegeStudentByUidAndName")
    @HttpAuthChecker
    public ResultVO<List<StudentInfoVO>> getCollageStudentByUidAndName(@RequestBody SearchCollegeStudentByUidAndNameDTO dto) {

        String stuUid = "".equals(dto.getUid()) ? NO_PARAM : dto.getUid();
        //空值转换，防止没输入学号时，也能正确查询，且前端显示正确的查询到的记录数
        dto.setUid(stuUid);

        int uid = NowAdminInfo.getUserUid2();//获取当前登录教务的工号

        List<StudentInfoVO> studentInfoVO = studentInfoManagementService.getCollegeStudentByUidAndName(uid, dto);
        if (studentInfoVO != null) {
            log.info("所属学院的学生信息：{}", studentInfoVO);
            return ResultVO.success("所属学院的学生信息", studentInfoVO);
        }
        log.warn("所属学院暂无相应学生信息！");
        return ResultVO.error("所属学院暂无相应学生信息!");
    }

    /**
     * 4.通过学号和姓名获取本院学生信息条数
     *
     * @return 获取到的通过学号和姓名获取本院学生信息条数
     */
    @ApiOperation(value = "通过学号和姓名获取本院学生信息条数")
    @PostMapping("/getTotalLineCollegeStudentByUidAndName")
    @HttpAuthChecker
    public ResultVO<Integer> getTotalLineCollegeStudentByUidAndName(@RequestBody SearchTotalCollegeStudentByUidAndNameDTO dto) {

        String stuUid = "".equals(dto.getUid()) ? NO_PARAM : dto.getUid();
        //空值转换，防止没输入学号时，也能正确查询，且前端显示正确的查询到的记录数
        dto.setUid(stuUid);

        int uid = NowAdminInfo.getUserUid2();//获取当前登录教务的工号

        int count = studentInfoManagementService.getTotalLineCollegeStudentByUidAndName(uid, dto);
        log.info("学号：{}，姓名：{}，通过学号和姓名对应本院学生信息条数：{}", dto.getUid(), dto.getName(), count);
        return ResultVO.success("通过学号和姓名对应本院学生信息条数", count);
    }

    /**
     * 5.更新学生信息
     *
     * @return 更新操作状态
     */
    @ApiOperation(value = "更新学生信息")
    @PostMapping("/updateStudent")
    @HttpAuthChecker
    public ResultVO<String> updateStudent(@RequestBody StudentUpdateVO studentUpdateVO) {
        if (studentInfoManagementService.updateStudent(studentUpdateVO) == UPDATE_FAILED.getCode()) {
            log.warn("更新失败：{}", studentUpdateVO);
            return ResultVO.error("更新失败");
        }
        log.info("更新成功：{}", studentUpdateVO);
        return ResultVO.success("更新成功", null);
    }
}
